import { app, BrowserWindow, ipcMain, dialog, MenuItem, globalShortcut } from 'electron'

import Datastore from 'nedb'
import path from 'path'

let noteDb = new Datastore({
  autoload: true,
  filename: path.join(app.getPath('userData'), '/db/note.db')
})

// import noteDb from "../renderer/datastore/translate";

/**
 * Set `__static` path to static files in production
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
 */
if (process.env.NODE_ENV !== 'development') {
  global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
} else {
  global.__static = require('path').join(__dirname, '/../../static').replace(/\\/g, '\\\\')
}
const electron = require('electron') //获取electron对象
// const path = require('path');

let canQuit = false;


//用一个 Tray 来表示一个图标,这个图标处于正在运行的系统的通知区 ，通常被添加到一个 context menu 上.
const Menu = electron.Menu;
const Tray = electron.Tray;
//托盘对象 
var appTray = null;
//主窗体
let mainWindow
//播放窗体
let playWindow

let newWindow

//关于
let aboutWindow


const winURL = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080/#/main`
  : `file://${__dirname}/index.html#main`


const noteURL = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080/#/note`
  : `file://${__dirname}/index.html#/note`

const playUrl = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080/#/play`
  : `file://${__dirname}/index.html#/play`

const aboutUrl = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080/#/about`
  : `file://${__dirname}/index.html#/about`


function createWindow() {

  // //所有屏幕宽高(后面截图工具需要用到多屏幕拼接显示一个窗口【不知道能不能行】)
  // let screens = electron.screen.getAllDisplays()
  // //屏幕总大小
  // var maxH = 0;
  // var maxW = 0;

  // //原点
  // // var originX=screens[0].bounds.x;
  // // var originY=screens[0].bounds.y;
  // var originX = 0;
  // var originY = 0;

  // console.log(originX, originY)
  // //先按x轴从小到大排序
  // let sort_x = function (screen, screen_copy) {
  //   return screen.bounds.x - screen_copy.bounds.x
  // }
  // let screens_x = screens.sort(sort_x);
  // let externalDisplay_x = screens_x.find((display) => {

  //   if (display.bounds.x > 0) {
  //     maxW = maxW + display.bounds.width
  //   } else {
  //     if (display.bounds.width > maxW) {
  //       maxW = display.bounds.width
  //     }
  //   }
  // })

  // //再按y轴从小到大排序
  // let sort_y = function (screen_y, screen_ycopy) {
  //   return screen_y.bounds.x - screen_ycopy.bounds.x
  // }
  // let screens_y = screens.sort(sort_y);
  // let externalDisplay_y = screens_y.find((display) => {
  //   if (display.bounds.y > 0) {
  //     maxH = maxH + display.bounds.height
  //   } else {
  //     if (display.bounds.height > maxH) {
  //       maxH = display.bounds.height
  //     }
  //   }

  // })

  // newWindow = new BrowserWindow({
  //   frame: false,//无边框
  //   useContentSize: true,
  //   alwaysOnTop: true,
  //   kiosk: true, //打开报亭模式才可以达到宽高达到最大值原点坐标不偏移到其他屏幕功能
  //   resizable: false,//禁止缩放
  //   minimizable: true,//允许最大化（在 Linux 中无效 好像不禁止缩放情况下才有效）
  //   // skipTaskbar:true,//任务栏中显示窗口 (好像没什么用) 
  //   x: originX,
  //   y: originY,
  //   height: maxH,
  //   width: (maxW - 2),
  //   webPreferences: {
  //     webSecurity: false //允许此窗口访问本地文件 
  //   }
  // })
  // newWindow.loadURL(playUrl)
  // if (screens.length > 1) {
  //   newWindow.maximize()
  // } else {
  //   let option = { x: originX, y: originY, width: (maxW), height: maxH };
  //   newWindow.setBounds(option);
  // }

  // newWindow.on('closed', () => {
  //   newWindow = null
  // })

  // console.log(maxW, maxH);
  /**
   * Initial window options
   */
  let in_array = function (search, array) {
    for (var i in array) {
      if (array[i] == search) {
        return true;
      }
    }
    return false;
  };
  let note_windowids = [];
  let note_windows = {};
  let note_left = 0;
  //生成便签
  let new_noteWindows = () => {
    let that = this;
    this.noe = 12121;
    noteDb.find({}, (err, docs) => {
      console.log(note_windowids)
      console.log(docs);
      docs.forEach(note => {
        //如果没有创建过则创建
        console.log(note._id)

        if (in_array(note._id, note_windowids) || note.is_show != 1) {
          return;
        }
        console.log(note)
        note_windowids.push(note._id)
        note_windows[note._id] = new BrowserWindow({
          frame: false,//无边框
          useContentSize: true,
          // resizable: false,//禁止缩放
          // minimizable: true,//允许最大化（在 Linux 中无效 好像不禁止缩放情况下才有效）
          // skipTaskbar:true,//任务栏中显示窗口 (好像没什么用) 
          x: mainExternalDisplay.bounds.x + 800 + note_left, //第一屏x位置
          y: mainExternalDisplay.bounds.y + 50,//第一屏y位置
          height: 600,
          width: 400,
          // webPreferences: {
          //   webSecurity: false //允许此窗口访问本地文件 
          // }
        })

        note_windows[note._id].loadURL(noteURL)
        note_left = note_left + 50;


      });

    });
  }
  // new_noteWindows(); 

  ipcMain.on('new_notewindow', e => {
    // //由于不刷新db对象无法获取到子进程添加的新数据(不知道为什么)所以这里刷新一下数据库对象 
    // noteDb = new Datastore({
    //   autoload: true,
    //   filename: path.join(app.getPath('userData'), '/db/note.db')
    // })
    //手动load一下也可以解决这个问题
    noteDb.loadDatabase();
    new_noteWindows();
  });//最小

  setTimeout(() => {
    console.log(note_windows)

  }, 800);

  //确定主窗口位置为0 0 开始
  let displays = electron.screen.getAllDisplays()
  let mainExternalDisplay = displays.find((display) => {
    return display.bounds.x == 0 && display.bounds.y == 0
  })
  mainWindow = new BrowserWindow({
    frame: false,//无边框
    useContentSize: true,
    resizable: false,//禁止缩放
    minimizable: true,//允许最大化（在 Linux 中无效 好像不禁止缩放情况下才有效）
    // skipTaskbar:true,//任务栏中显示窗口 (好像没什么用) 
    x: mainExternalDisplay.bounds.x + 500, //第一屏x位置
    y: mainExternalDisplay.bounds.y + 50,//第一屏y位置
    height: 563,
    width: 1000,

    webPreferences: {
      webSecurity: false //允许此窗口访问本地文件 
    }
  })

  //音乐播放窗口
  // playWindow = new BrowserWindow({
  //   frame: false,//无边框
  //   useContentSize: true,
  //   resizable: false,//禁止缩放
  //   minimizable: true,//允许最大化（在 Linux 中无效 好像不禁止缩放情况下才有效）
  //   // skipTaskbar:true,//任务栏中显示窗口 (好像没什么用) 
  //   x: mainExternalDisplay.bounds.x + 500, //第一屏x位置
  //   y: mainExternalDisplay.bounds.y + 50,//第一屏y位置
  //   height: 300,
  //   width: 500,
  //   webPreferences: {
  //     webSecurity: false //允许此窗口访问本地文件 
  //   }
  // })
  // playWindow.loadURL(playUrl)

  // playWindow.on('closed', () => {
  //   playWindow = null
  // })


  // mainWindow.webContents.openDevTools()   //打包后开启调试模式

  ipcMain.on('min_mainwindow', e => mainWindow.minimize());//最小
  ipcMain.on('max_mainwindow', e => mainWindow.maximize());//最大
  ipcMain.on('unmax_mainwindow', e => mainWindow.unmaximize());//取消最大


  //ipcMain.on('close', e => mainWindow.close());//关闭

  // dialog.showErrorBox('一条错误信息', '错误消息演示.') //对话框 感觉linux下不友好（其他平台  未测试） 因为它是一个阻塞进程

  mainWindow.loadURL(winURL)
  //报亭模式(禁止用户移动改变窗体,只能点击输入输出等操作)
  // mainWindow.setKiosk(true)

  mainWindow.on('closed', () => {
    mainWindow = null
  })

  //点击关闭隐藏窗口
  ipcMain.on('close_mainwindow', event => {
    mainWindow.hide();
    mainWindow.setSkipTaskbar(true);
    event.preventDefault();
  });

  //声音提醒
  // function playAudio(){
  //   var audio = new Audio(__dirname + '/tray/app.wav');
  //   audio.play();
  //   setTimeout(function(){
  //       console.log("暂停播放....");
  //       audio.pause();// 暂停
  //   }, 800)
  // }
  // playAudio();

  /*
  //对话框 (屏幕中间的那种)
  dialog.showMessageBox({
        type: 'warning',
        title: '警告',
        message: `端口  被占用`
      })
  
  */
  //全局快捷键(测试可用) 唤起
  globalShortcut.register('CommandOrControl+alt+k', () => {
    //检测到快捷键唤起主页面
    mainWindow.show();
    //发送消息给渲染层 
    mainWindow.setSkipTaskbar(false);
    mainWindow.webContents.send('main-process-messages', 'show_window');

    console.log('CommandOrControl+L is pressed')
  })
  //播放暂停
  globalShortcut.register('CommandOrControl+alt+Shift+p', () => {
    //发送消息给渲染层 
    mainWindow.setSkipTaskbar(false);
    mainWindow.webContents.send('main-process-messages', 'play_music');

    console.log('CommandOrControl+alt+Shift+k is pressed')
  })
  //上一曲
  globalShortcut.register('CommandOrControl+alt+Shift+Home', () => {
    mainWindow.setSkipTaskbar(false);
    mainWindow.webContents.send('main-process-messages', 'play_previous');

    console.log('CommandOrControl+alt+Shift+k is pressed')
  })
  //下一曲
  globalShortcut.register('CommandOrControl+alt+Shift+End', () => {
    //发送消息给渲染层 
    mainWindow.setSkipTaskbar(false);
    mainWindow.webContents.send('main-process-messages', 'play_next');

    console.log('CommandOrControl+alt+Shift+k is pressed')
  })

 

  globalShortcut.register('CommandOrControl+Shift+alt+p', () => {
    // //检测到快捷键唤起主页面
    mainWindow.show();
    // //发送消息给渲染层 
    // mainWindow.setSkipTaskbar(false);
    // mainWindow.webContents.send('main-process-messages', 'play_voice');

  })


  //本地快捷键(测试不成功)
  const menu = new Menu()
  menu.append(new MenuItem({
    label: 'Print',
    accelerator: 'CmdOrCtrl+Shift+K',
    click: () => { console.log('time to print stuff') }
  }))

  //系统托盘右键菜单
  var trayMenuTemplate = [
    {
      label: '主页面',
      click: function () {
        mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show()
        mainWindow.show();
        mainWindow.setSkipTaskbar(false);
      } //打开相应页面 
    },
    // {
    //   label: '设置',
    //   click: function () { } //打开相应页面
    // },
    // { 
    //   label: '帮助',
    //   click: function () { }
    // },
    {
      label: '关于',
      click: function () {
        console.log(aboutUrl)
        //打开关于页面
        if (!aboutWindow) {
          aboutWindow = new BrowserWindow({
            // frame: false,//无边框
            title: '关于',
            useContentSize: true,
            x: mainExternalDisplay.bounds.x + 500, //第一屏x位置
            y: mainExternalDisplay.bounds.y + 50,//第一屏y位置
            height: 300,
            width: 500
          })
          aboutWindow.webContents.openDevTools()   //打包后开启调试模式

          aboutWindow.loadURL(aboutUrl)
        } else {
          // aboutWindow.setAlwaysOnTop(true);
          aboutWindow.focus()
          // setTimeout(() => {
          //   aboutWindow.setAlwaysOnTop(false);
          // }, 100);
        }
        aboutWindow.on('close', (e) => {
          aboutWindow = null;
        });


      }
    },
    {
      label: '退出',
      click: function () {
        canQuit = 1;//允许进程结束
        mainWindow = null;//先销毁窗口 再退出 如果是最小状态直接退出可能会出现无法退出
        app.quit();
      }
    }
  ];

  //系统托盘图标目录

  let trayIcon = path.join(global.__static, '/icons');


  let appTray = new Tray(path.join(trayIcon, '/icon.png'));//app.ico是app目录下的ico文件  [ico会出现转换失败的情况  试了一下png也是可以的]



  //系统托盘图标闪烁
  var count = 0, timer = null;
  ipcMain.on('get_new_message', event => {
    timer = setInterval(function () {
      count++;
      if (count % 2 == 0) {
        appTray.setImage(path.join(trayIcon, 'icon.png'))
      } else {
        //appTray.setImage(path.join(trayIcon, 'icon_lucency.png'))
      }
    }, 500);
  })
  //关闭系统托盘图闪烁
  ipcMain.on('new_message_read', event => {
    if (!!timer) {
      clearInterval(timer);
      appTray.setImage(path.join(trayIcon, 'icon.png'))
    }
  })

  //任务栏激活闪烁状态 
  mainWindow.flashFrame(true);



  //图标的上下文菜单
  const contextMenu = Menu.buildFromTemplate(trayMenuTemplate);


  //只启动一个实例  makeSingleInstance函数是整个功能需求的核心。大家仔细看看这里即可。
  const shouldQuit = app.makeSingleInstance((commandLine, workingDirectory) => {
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore()
      mainWindow.focus()
    }
  })
  if (shouldQuit) {
    app.quit()
  }

  //设置此托盘图标的悬停提示内容
  appTray.setToolTip('我的托盘图标');

  //设置此图标的上下文菜单
  appTray.setContextMenu(contextMenu);
  //单击右下角小图标显示应用 (linux不适用)
  appTray.on('click', function () {
    mainWindow.show();
  })

  //这里是触发close方法即刻销毁  如果需要图标常驻托盘则主线程应该处于活动状态,只是显示也隐藏切换
  mainWindow.on('close', (e) => {
    mainWindow = null;
  });

  //图标结束
  /*
    //做了一个大胆的尝试  页面触发事件的时候传一个回调里面新打开一个窗口 居然可行~~
    // ipcMain.on('close', e => {
    //投射窗口
    let externalDisplay = displays.find((display) => {
      return display.bounds.x !== 0 || display.bounds.y !== 0
    })
  
    if (externalDisplay) {
      newWindow = new BrowserWindow({
        fullscreen: true,//默认全屏
        frame: false,//无边框
        titleBarStyle: 'hidden',//取消标题栏 适用于苹果和linux  不知道Windows会不会报错
        x: externalDisplay.bounds.x + 500, //第二屏x位置
        y: externalDisplay.bounds.y + 50,//第二屏y位置
        // width: 1000,
        // height: 800
      })
      //监听事件
  
  
      newWindow.loadURL(newURL)
      //全屏
      // newWindow.maximize()
    }
    newWindow.on('closed', () => {
      newWindow = null
    })
    // });
  */
}


app.on('ready', createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow()
  }
})


